
/**
 * https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array/
 * 找出数组中所有消失的数字
 * @param nums 
 */
const findDisappearedNumbers = (nums: number[]): number[] => {
    const len = nums.length;
    const ans: number[] = []
    for (let n of nums) {
        // 获取当前值对应的元素
        const ori = (n - 1) % len

        // 该位置加上长度
        nums[ori] += len
    }

    // 某项没有加上长度的, 说明是该项缺少的
    for (let i = 0; i < len; i++) {
        if (nums[i] <= n) {
            ans.push(i + 1)
        }
    }

    return ans
};


const findDisappearedNumbers3 = (nums: number[]): number[] => {
    const len = nums.length;

    // 存放所有的数据
    const set: Record<number, boolean> = {}
    for (let i = 1; i <= len; i++) {
        set[nums[i]] = true
    }

    // 删掉map中存在的, set后面剩下的数据, 就是缺省的数据
    for (let i = 0; i < len; i++) {
        // 删掉
        if (set[nums[i]]) delete set[nums[i]]
    }


    return Object.keys(set).map(i => +i)
};


const findDisappearedNumbers2 = (nums: number[]): number[] => {
    const len = nums.length;

    // 存放所有的数据
    const set = new Set<number>()
    for (let i = 1; i <= len; i++) {
        set.add(i)
    }

    // 删掉map中存在的, set后面剩下的数据, 就是缺省的数据
    for (let i = 0; i < len; i++) {
        if (set.has(nums[i])) set.delete(nums[i])
    }


    return [...set];
};